/**
 * 输入一个链表，输出该链表中倒数第k个节点。为了符合大多数人的习惯，本题从1开始计数，即链表的尾节点是倒数第1个节点。

例如，一个链表有 6 个节点，从头节点开始，它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

 

示例：

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var getKthFromEnd = function (head, k) {
    //自己写的
    let node = head
    let length = 0
    while (node) {
        length++
        node = node.next
    }
    node = head
    while (node) {
        if (length === k) {
            break
        }
        node = node.next
        length--
    }

    return node
};

// 官方的顺序查找
var getKthFromEnd = function (head, k) {
    let node = head, n = 0;
    while (node) {
        node = node.next;
        n++;
    }
    node = head;
    for (let i = 0; i < n - k; i++) {
        node = node.next;
    }
    return node;
};


// 使用快慢双指针
var getKthFromEnd = function (head, k) {
    let fast = head
    let slow = head
    while (fast && k > 0) { //先让快指针向前走K步
        fast = fast.next
        k--
    }

    while (fast) { //再让慢指针和快指针前进，直到快指针走完，慢指针则停在第K步
        fast = fast.next
        slow = slow.next
    }

    return slow
};
